"""
@name : finish
@author : liuyi
@projectname: Demo01
@time : 2022/4/16  10:04
"""

# 1、输入数字n，输出n天前的日期（time或者datatime模块）
# import time
# times = input("请输入一个数字:")
# if times.isdigit():
#     old_time = int(times) * 24 * 60 * 60
#     now_time = time.time()
#     past_time = time.localtime(now_time - old_time)
#     print(f"{times}天前的日期是:",time.strftime("%Y-%m-%d", past_time))
# else:
#     print("你输入的数据有除数字外的特殊字符")


# 2、输出指定文件夹下有哪些文件或文件夹（实现ls命令， os）
# D:\笔记
# import os
# path = input("请输入一个路径:")
# if os.path.exists(path):
#     lst = os.listdir("D:\笔记")
#     print(lst)
# else:
#     print("你输入的路径不存在")


# 3、列表去重，并且从小到大排序
# lst = [1,5,8,1,5,9,10,6]
# now_lst = []
# #去重
# for i in lst:
#     if i not in now_lst:
#         now_lst.append(i)
# #排序
# for i in range(len(now_lst)):
#     print(len(now_lst) - i - 1)
#     for j in range(len(now_lst) - i - 1): # 5,4,3,2,1,0
#         if now_lst[j] > now_lst[j + 1]:
#             now_lst[j], now_lst[j + 1] = now_lst[j + 1], now_lst[j]
# print(now_lst)

# 4、如何在一个函数内部修改全局变量
# a = 1
# def modify():
#     a = 2
#     print(a)
#
# def modify_global():
#     global a
#     a = 3
#     print(a)
# if __name__ == '__main__':
#     modify()
#     modify_global()
#     print(a)


# 5、如何跨模块共享全局变量
# 通过模块的导入实现跨模块共享全局变量

# 6、python的基本数据类型有哪些？
# int、string、boolean、float、None

# 7、python中生成随机整数（1-10），随机小数（1-10），随机小数（0-1）的方法
# import random
# #随机整数（1-10）
# random.randint(1,10)
# #随机小数（1-10）
# random.uniform(1,10)
# #随机小数（0-1）
# random.random()

# 8、python中哪些是可变数据类型，哪些是不可变数据类型
# 不可变数据类型 ： int (整数类型) float (浮点数类型) bool (布尔类型) str (字符串类型) tuple(元组类型)。
# 可变数据类型 ：  list(列表类型) dict(字典类型) set(集合类型)。

# 9、a+=1与a=a+1有什么区别
# 对于可变对象，a += 1 直接在原内存地址上操作a = a + 1开辟新的内存操作
# 对于不可变对象，a += 1和a = a + 1都是在新开辟的空间操作

# 10、什么是pep8？说出5点它的标准
# PEP8是针对python代码格式而编订的风格指南，采用一致的编码风格可以令代码更加易懂易读
# 1、使用空格来表示缩进而不要用制表符Tab
# 2、和语法相关的每一层缩进都用4个空格来表示。
# 3、每行的字符数不要超过79个字符
# 4、类中私有的实例属性，应该以两个下划线开头
# 5、类和异常的命名，应该每个单词首字母大写

# 11、给定一个字符串，找出字符串第一个重复的字符
# st = "asdfasdfaiouhsdflha"
# def str_repetition(str):
#     """
#     用来找第一个重复的字符
#     :param str: 需要判断的字符串
#     :return:
#     """
#     st_dict = {}
#     for i in str:
#         if i in st_dict.keys():
#             st_dict[i] +=1
#         else:
#             st_dict[i] = 1
#         for a,b in st_dict.items():
#             if b > 1:
#                 print(f"{a}是第一个重复的字符")
#                 return
# str_repetition(st)

# 12、简述深拷贝与浅拷贝
# 深拷贝  ：  指的是重新分配一块内存，创建一个新的对象，但里面的元素是原对象中各个子对象的引用，修改拷贝得到的文件，原文件也会发生变化
# 浅拷贝  ： 是指重新分配一块内存，创建一个新的对象，并且将原对象中的元素，以递归的方式，通过创建新的子对象拷贝到新对象中。因此，新对象和原对象没有任何关联。

# 13、简述python内存机制
# 引用计数为主，分代回收和标记清除为辅的垃圾回收方式，进行内存回收管理
# 还引用了小整型缓冲池以及常用字符串驻留区的方式进行内存分配管理

# 14、使用python实现冒泡排序，快速排序
# 冒泡排序
# def digital_judgment(list):
#     """
#     判断输入的集合是不是全部都是数字
#     :param list: 要判断的集合
#     :return: 1 "列表中含有非数字的特殊字符" ， 2 满足条件
#     """
#     contre = 0
#     for i in list:
#         if str(i).isdigit():
#             pass
#         else:
#             contre = 1
#     if contre == 1:
#         return 1
#     else:
#         return 2
#
#
# def bubbling_sort(lst, contre=True):
#     """
#     实现排序
#     :param list:需要排序的列表集合
#     :param contre: True 从大到小  ，False  从小到大，默认True
#     :return:
#     """
#     if isinstance(lst, list) and digital_judgment(lst) == 2:
#         if contre == True:
#             for i in range(len(lst)):
#                 for j in range(len(lst) - i - 1):
#                     if lst[j] < lst[j + 1]:
#                         lst[j], lst[j + 1] = lst[j + 1], lst[j]
#         elif contre == False:
#             for i in range(len(lst)):
#                 for j in range(len(lst) - i - 1):
#                     if lst[j] > lst[j + 1]:
#                         lst[j], lst[j + 1] = lst[j + 1], lst[j]
#         else:
#             return "你输入的排序方式不存在"
#     elif type(lst) != lst:
#         return "输入的判断参数非列表"
#     elif digital_judgment(lst) == 1:
#         return "列表中含有非数字的特殊字符"
#     return lst
#
#
# if __name__ == '__main__':
#     lst = [3, 5, 1, 7, 3, 7, 9, 8, 16]
#     print(bubbling_sort(lst))

# 快速排序
# def partition(arr, low, high):
#     """
#     :param arr: arr[] --> 排序数组
#     :param low: low  --> 起始索引
#     :param high: high  --> 结束索引
#     :return:
#     """
#     i = (low - 1)  # 最小元素索引
#     pivot = arr[high]
#     for j in range(low, high):
#         # 当前元素小于或等于 pivot
#         if arr[j] <= pivot:
#             i = i + 1
#             arr[i], arr[j] = arr[j], arr[i]
#
#     arr[i + 1], arr[high] = arr[high], arr[i + 1]
#     return (i + 1)
#
#
# # 快速排序函数
# def quickSort(arr, low, high):
#     if low < high:
#         pi = partition(arr, low, high)
#
#         quickSort(arr, low, pi - 1)
#         quickSort(arr, pi + 1, high)
#
# arr = [10, 7, 8, 9, 1, 5]
# quickSort(arr, 0, len(arr) - 1)
# print(f"排序后的数组:{arr}")

# 15、验证一个字符串是否属于回文（从左到右，从右到左都是一样）
# st = "aba"
# def palindrome(string):
#     """
#     判断给定字符是否属于回文
#     :param string: 需要判断的字符串
#     :return:
#     """
#     new_st = st[::-1]
#     if st == new_st:
#         print("该字符串属于回文")
#     else:
#         print("该字符串不属于回文")
# palindrome(st)


# 1、要求
# 提取出这个文本里面的ip字段、时间字段、带宽字段
# 每个字段都是以空白作为分割   ip字段在第一个  时间字段在第四个 带宽字段在第10个
#  首先将时间格式都统一转化为 2021-06-04 04:00:20  （time）
#  通过ip 去解析出它的省份和运营商是什么    （requests，json）
#  https://ip.taobao.com/outGetIpInfo?accessKey=alibaba-inc&ip=106.11.159.66
#  isp就是运营商字段   region就是省份字段
#  最后将得到的  时间、省份、运营商、带宽字段都写入文件
#
#  2021-06-04 04:00:20,湖南,电信,1004

import requests
import json
# 读取weblog文本,并打开文件file1
with open("weblog.txt","r",encoding="gbk")as fp:
    with open("file", "w", encoding="utf-8")as fp1:
        for line in fp:
            #将获取的每一行字符串以空格分割，再转变成列表，方便后面获取值
            a = list(line.split(" "))
            import datetime
            #ctime是改格式之后的时间
            ctime = datetime.datetime.strptime(a[3], "[%d/%b/%Y:%H:%M:%S")
            # 网站请求，目标url
            url = 'https://ip.taobao.com/outGetIpInfo?accessKey=alibaba-inc&ip=%s'%a[0]
            # 向目标url发送get请求
            response = requests.get(url)
            # 将字符串转换位字典
            dict = json.loads(response.text)
            reg = dict["data"]["region"]
            isp = dict["data"]["isp"]
            #写入文件file
            fp1.write(str(ctime)+','+reg+','+isp+','+a[9]+'\n')
